#define _CRT_SECURE_NO_WARNINGS
//作者：宋安康

#include<stdio.h>
#include"SeqList.h"
#include<stdlib.h>
#include<assert.h>
void SLInit(SL* sl)
{
	sl->arr = NULL;
	sl->size = sl->capacity = 0;
}

void SLcheckCapacity(SL* sl)
{
	//空间不够，扩容
	if (sl->capacity == sl->size)
	{
		int newCapacity = sl->capacity == 0 ? 4 : 2 * sl->capacity;
		SLDataType* tmp = (SLDataType*)realloc(sl->arr, newCapacity * (sizeof(SLDataType)));
		if (tmp == NULL)
		{
			perror("realloc");
			exit(1);  //扩容失败，直接中断程序
		}

		//扩容成功
		//free(sl->arr);   //realloc自动释放
		sl->arr = tmp;
		sl->capacity = newCapacity;
	}
}
//尾插
void SLPushBack(SL* sl, SLDataType x)
{
	assert(sl != NULL);
	/*if (sl == NULL)
	{
		return 0;
	}*/
	SLcheckCapacity(sl);
	//空间足够，直接插入
	sl->arr[sl->size] = x;
	sl->size++;

}
//头插
void SLPushFront(SL* sl, SLDataType x)
{
	assert(sl);
	SLcheckCapacity(sl);  //扩容
	//空间足够
	for (int i = sl->size; i > 0; i--)//旧数据向后移
	{
		sl->arr[i] = sl->arr[i - 1];
	}sl->arr[0] = x;
	sl->size++;
}
//遍历
void SLPrint(SL* sl)
{
	for (int i = 0; i < sl->size; i++)
	{
		printf("%d ", sl->arr[i]);
	}printf("\n");
}
//销毁

//尾删
void SLPopBack(SL* sl)
{
	assert(sl);
	assert(sl->size);
	sl->size--;
	//有数据和没有数据

}
//头删
void SLPopFront(SL* sl)
{
	assert(sl);
	//后面的数据向前移位
	for (int i = 0; i < sl->size - 1; i++)
	{
		sl->arr[i] = sl->arr[i + 1];
	}
	sl->size--;
}
//指定位置插入数据
void SLInsert(SL* sl, int pos, SLDataType x)
{
	assert(sl);
	assert(pos >= 0 && pos <= sl->size);
	SLcheckCapacity(sl);
	//pos及之后的数据向后移一位，pos空出来
	for (int i = sl->size; i > pos; i--)
	{
		sl->arr[i] = sl->arr[i - 1];
	}
	sl->arr[pos] = x;
	sl->size++;
}


//指定位置删除
void SLErase(SL* sl, int pos)
{
	assert(sl);
	//pos之后的数据向前移位
	assert(pos >= 0 && pos < sl->size);
	for (int i = pos; i < sl->size - 1; i++)
	{
		sl->arr[i] = sl->arr[i + 1];
	}
	sl->size--;
}
//顺序表中查找x
//int SLFind(SL* sl, SLDataType x)
//{
//	assert(sl);
//	for (int i = 0; i < sl->size; i++)
//	{
//		if (sl->arr[i] == x)
//		{
//			return i;
//		}
//	}
//	return -1;
//}
//线性表的销毁
void SLDestroy(SL* sl)
{
	assert(sl);
	if (sl->arr == NULL)
	{
		free(sl->arr);

	}
	sl->arr = NULL;
	sl->size = sl->capacity = 0;


}
